CQRSïŒã³ãã³ãã¯ãšãªè²¬ååé¢ïŒã®å æ¬çãªã¬ã€ããã¹ã±ãŒã©ãã«ã§ä¿å®æ§ã®é«ãã·ã¹ãã ãæ§ç¯ããããã®ååãå©ç¹ãå®è£ æŠç¥ãå®äžçã®å¿çšäŸã解説ããŸãã
CQRSïŒã³ãã³ãã¯ãšãªè²¬ååé¢ã®åŸ¹åºè§£èª¬
ãœãããŠã§ã¢ã¢ãŒããã¯ãã£ã®çµ¶ãéãªãé²åããäžçã«ãããŠãéçºè ã¯ã¹ã±ãŒã©ããªãã£ãä¿å®æ§ãããã©ãŒãã³ã¹ãä¿é²ãããã¿ãŒã³ãšãã©ã¯ãã£ã¹ãåžžã«æ±ããŠããŸãããã®ãããªãã¿ãŒã³ã®äžã§å€§ããªæ³šç®ãéããŠããã®ãCQRSïŒCommand Query Responsibility SegregationïŒã§ãããã®èšäºã§ã¯ãCQRSã®ååãå©ç¹ãå®è£ æŠç¥ããããŠå®äžçã®å¿çšäŸãæ¢ããªãããå æ¬çãªã¬ã€ããæäŸããŸãã
CQRSãšã¯äœãïŒ
CQRSã¯ãããŒã¿ã¹ãã¢ã®èªã¿åãæäœãšæžãèŸŒã¿æäœãåé¢ããã¢ãŒããã¯ãã£ãã¿ãŒã³ã§ããããã¯ãã³ãã³ãïŒã·ã¹ãã ã®ç¶æ ã倿ŽããæäœïŒãšã¯ãšãªïŒç¶æ ã倿Žããã«ããŒã¿ãååŸããæäœïŒãåŠçããããã«ãå¥ã ã®ã¢ãã«ã䜿çšããããšãæå±ããŠããŸãããã®åé¢ã«ãããåã¢ãã«ãç¬ç«ããŠæé©åããããšãå¯èœã«ãªããããã©ãŒãã³ã¹ãã¹ã±ãŒã©ããªãã£ãã»ãã¥ãªãã£ã®åäžã«ã€ãªãããŸãã
åŸæ¥ã®ã¢ãŒããã¯ãã£ã§ã¯ãèªã¿åããšæžã蟌ã¿ã®æäœãåäžã®ã¢ãã«å ã«ãŸãšããããšããããããŸãããã®ã¢ãããŒãã¯åæã®å®è£ ã¯ç°¡åã§ãããç¹ã«ã·ã¹ãã ãè€éã«ãªãã«ã€ããŠãããã€ãã®èª²é¡ã«ã€ãªããå¯èœæ§ããããŸãïŒ
- ããã©ãŒãã³ã¹ã®ããã«ããã¯ïŒåäžã®ããŒã¿ã¢ãã«ã¯ãèªã¿åããšæžã蟌ã¿ã®äž¡æ¹ã®æäœã«æé©åãããŠããªãå¯èœæ§ããããŸããè€éãªã¯ãšãªãæžãèŸŒã¿æäœãé ããããããã®éããŸãç¶ãã§ãã
- ã¹ã±ãŒã©ããªãã£ã®å¶éïŒã¢ããªã·ãã¯ãªããŒã¿ã¹ãã¢ãã¹ã±ãŒãªã³ã°ããã®ã¯å°é£ã§é«äŸ¡ã«ãªãããšããããŸãã
- ããŒã¿äžè²«æ§ã®åé¡ïŒã·ã¹ãã å šäœã§ããŒã¿ã®äžè²«æ§ãç¶æããããšã¯ãç¹ã«åæ£ç°å¢ã§ã¯é£ãããªãããšããããŸãã
- è€éãªãã¡ã€ã³ããžãã¯ïŒèªã¿åããšæžã蟌ã¿ã®æäœãçµã¿åãããããšã¯ãè€éã§å¯çµåãªã³ãŒãã«ã€ãªãããä¿å®ãé²åãå°é£ã«ããŸãã
CQRSã¯ãé¢å¿äºã®æç¢ºãªåé¢ãå°å ¥ããããšã§ãããã®èª²é¡ã«å¯ŸåŠããéçºè ãåã¢ãã«ãç¹å®ã®ããŒãºã«åãããŠèª¿æŽã§ããããã«ããŸãã
CQRSã®åºæ¬åå
CQRSã¯ãããã€ãã®äž»èŠãªååã«åºã¥ããŠããŸãïŒ
- é¢å¿ã®åé¢ïŒåºæ¬çãªååã¯ãã³ãã³ããšã¯ãšãªã®è²¬åãå¥ã ã®ã¢ãã«ã«åé¢ããããšã§ãã
- ç¬ç«ããã¢ãã«ïŒã³ãã³ãã¢ãã«ãšã¯ãšãªã¢ãã«ã¯ãç°ãªãããŒã¿æ§é ããã¯ãããžãŒãããã«ã¯ç©ççãªããŒã¿ããŒã¹ã䜿çšããŠå®è£ ã§ããŸããããã«ãããç¬ç«ããæé©åãšã¹ã±ãŒãªã³ã°ãå¯èœã«ãªããŸãã
- ããŒã¿åæïŒèªã¿åãã¢ãã«ãšæžã蟌ã¿ã¢ãã«ãåé¢ãããŠãããããããŒã¿åæãéåžžã«éèŠã§ããããã¯éåžžãéåæã¡ãã»ãŒãžã³ã°ãŸãã¯ã€ãã³ããœãŒã·ã³ã°ã䜿çšããŠå®çŸãããŸãã
- çµææŽåæ§ïŒCQRSã¯ãã°ãã°çµææŽåæ§ãæ¡çšããŸããããã¯ãããŒã¿ã®æŽæ°ãèªã¿åãã¢ãã«ã«å³åº§ã«åæ ãããªãå¯èœæ§ãããããšãæå³ããŸããããã«ããããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãåäžããŸããããŠãŒã¶ãŒãžã®æœåšçãªåœ±é¿ãæ éã«èæ ®ããå¿ èŠããããŸãã
CQRSã®å©ç¹
CQRSãå®è£ ãããšã次ã®ãããªæ°å€ãã®å©ç¹ãåŸãããŸãïŒ
- ããã©ãŒãã³ã¹ã®åäžïŒèªã¿åãã¢ãã«ãšæžã蟌ã¿ã¢ãã«ãç¬ç«ããŠæé©åããããšã§ãCQRSã¯ã·ã¹ãã å šäœã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸããèªã¿åãã¢ãã«ã¯é«éãªããŒã¿ååŸã«ç¹åããŠèšèšã§ããæžã蟌ã¿ã¢ãã«ã¯å¹ççãªããŒã¿æŽæ°ã«éäžã§ããŸãã
- ã¹ã±ãŒã©ããªãã£ã®åŒ·åïŒèªã¿åãã¢ãã«ãšæžã蟌ã¿ã¢ãã«ã®åé¢ã«ãããç¬ç«ããã¹ã±ãŒãªã³ã°ãå¯èœã«ãªããŸããã¯ãšãªè² è·ã®å¢å ã«å¯Ÿå¿ããããã«èªã¿åãã¬ããªã«ã远å ã§ããæžãèŸŒã¿æäœã¯ã·ã£ãŒãã£ã³ã°ãªã©ã®æè¡ã䜿çšããŠåå¥ã«ã¹ã±ãŒã«ã§ããŸãã
- ãã¡ã€ã³ããžãã¯ã®ç°¡çŽ åïŒCQRSã¯ãã³ãã³ãåŠçãã¯ãšãªåŠçããåé¢ããããšã§ãè€éãªãã¡ã€ã³ããžãã¯ãç°¡çŽ åã§ããŸããããã«ãããããä¿å®ããããããã¹ãããããã³ãŒãã«ã€ãªãããŸãã
- æè»æ§ã®åäžïŒèªã¿åãã¢ãã«ãšæžã蟌ã¿ã¢ãã«ã«ç°ãªããã¯ãããžãŒã䜿çšããããšã§ãåã¿ã¹ã¯ã«é©ããããŒã«ãéžæããéã®æè»æ§ãé«ãŸããŸãã
- ã»ãã¥ãªãã£ã®åäžïŒã³ãã³ãã¢ãã«ã¯ãã峿 Œãªã»ãã¥ãªãã£å¶çŽã§èšèšã§ããèªã¿åãã¢ãã«ã¯ãããªãã¯ãªå©çšã«æé©åã§ããŸãã
- ç£æ»å¯èœæ§ã®åäžïŒã€ãã³ããœãŒã·ã³ã°ãšçµã¿åãããããšã§ãCQRSã¯ã·ã¹ãã ã®ç¶æ ã«å¯Ÿãããã¹ãŠã®å€æŽã®å®å šãªç£æ»èšŒè·¡ãæäŸããŸãã
CQRSããã€äœ¿çšããã
CQRSã¯å€ãã®å©ç¹ãæäŸããŸãããäžèœè¬ã§ã¯ãããŸãããç¹å®ã®ãããžã§ã¯ãã«ãšã£ãŠCQRSãé©åãªéžæè¢ã§ãããã©ãããæ éã«æ€èšããããšãéèŠã§ããCQRSã¯æ¬¡ã®ãããªã·ããªãªã§æãæçã§ãïŒ
- è€éãªãã¡ã€ã³ã¢ãã«ïŒèªã¿åããšæžã蟌ã¿ã®æäœã§ç°ãªãããŒã¿è¡šçŸãå¿ èŠãªãè€éãªãã¡ã€ã³ã¢ãã«ãæã€ã·ã¹ãã ã
- é«ãèªã¿åã/æžãèŸŒã¿æ¯çïŒæžã蟌ã¿éãããèªã¿åãéãèããå€ãã¢ããªã±ãŒã·ã§ã³ã
- ã¹ã±ãŒã©ããªãã£èŠä»¶ïŒé«ãã¹ã±ãŒã©ããªãã£ãšããã©ãŒãã³ã¹ãèŠæ±ãããã·ã¹ãã ã
- ã€ãã³ããœãŒã·ã³ã°ãšã®çµ±åïŒæ°žç¶åãšç£æ»ã®ããã«ã€ãã³ããœãŒã·ã³ã°ã䜿çšããäºå®ã®ãããžã§ã¯ãã
- ç¬ç«ããããŒã ã®è²¬åïŒã¢ããªã±ãŒã·ã§ã³ã®èªã¿åãåŽãšæžã蟌ã¿åŽãç°ãªãããŒã ãæ åœããå Žåã
éã«ãåçŽãªCRUDã¢ããªã±ãŒã·ã§ã³ãã¹ã±ãŒã©ããªãã£èŠä»¶ã®äœãã·ã¹ãã ã«ã¯ãCQRSã¯æé©ãªéžæã§ã¯ãªããããããŸããããããã®å ŽåãCQRSã®è¿œå ãããè€éãããã®å©ç¹ãäžåãå¯èœæ§ããããŸãã
CQRSã®å®è£
CQRSã®å®è£ ã«ã¯ãããã€ãã®äž»èŠãªã³ã³ããŒãã³ããå«ãŸããŸãïŒ
- ã³ãã³ãïŒã³ãã³ãã¯ãã·ã¹ãã ã®ç¶æ ã倿Žããæå³ã衚ããŸããéåžžããCreateCustomerããUpdateProductãã®ããã«åœä»€åœ¢ã®åè©ã§ååãä»ããããŸããã³ãã³ãã¯åŠçã®ããã«ã³ãã³ããã³ãã©ã«ãã£ã¹ããããããŸãã
- ã³ãã³ããã³ãã©ïŒã³ãã³ããã³ãã©ã¯ã³ãã³ãã®å®è¡ãæ åœããŸããéåžžããã¡ã€ã³ã¢ãã«ãšå¯Ÿè©±ããŠã·ã¹ãã ã®ç¶æ ãæŽæ°ããŸãã
- ã¯ãšãªïŒã¯ãšãªã¯ããŒã¿ã®èŠæ±ã衚ããŸããéåžžããGetCustomerByIdããListProductsãã®ããã«èª¬æçãªåè©ã§ååãä»ããããŸããã¯ãšãªã¯åŠçã®ããã«ã¯ãšãªãã³ãã©ã«ãã£ã¹ããããããŸãã
- ã¯ãšãªãã³ãã©ïŒã¯ãšãªãã³ãã©ã¯ããŒã¿ã®ååŸãæ åœããŸããéåžžãã¯ãšãªãæºããããã«èªã¿åãã¢ãã«ãšå¯Ÿè©±ããŸãã
- ã³ãã³ããã¹ïŒã³ãã³ããã¹ã¯ãã³ãã³ããé©åãªã³ãã³ããã³ãã©ã«ã«ãŒãã£ã³ã°ããã¡ãã£ãšãŒã¿ãŒã§ãã
- ã¯ãšãªãã¹ïŒã¯ãšãªãã¹ã¯ãã¯ãšãªãé©åãªã¯ãšãªãã³ãã©ã«ã«ãŒãã£ã³ã°ããã¡ãã£ãšãŒã¿ãŒã§ãã
- èªã¿åãã¢ãã«ïŒèªã¿åãã¢ãã«ã¯ãèªã¿åãæäœã«æé©åãããããŒã¿ã¹ãã¢ã§ããã¯ãšãªã®ããã©ãŒãã³ã¹åäžã®ããã«ç¹å¥ã«èšèšãããã鿣èŠåãããããŒã¿ã®ãã¥ãŒã§ããå ŽåããããŸãã
- æžã蟌ã¿ã¢ãã«ïŒæžã蟌ã¿ã¢ãã«ã¯ãã·ã¹ãã ã®ç¶æ ãæŽæ°ããããã«äœ¿çšããããã¡ã€ã³ã¢ãã«ã§ããéåžžãæ£èŠåãããŠãããæžãèŸŒã¿æäœã«æé©åãããŠããŸãã
- ã€ãã³ããã¹ïŒãªãã·ã§ã³ïŒïŒã€ãã³ããã¹ã¯ãã¡ã€ã³ã€ãã³ããçºè¡ããããã«äœ¿çšããããããã®ã€ãã³ãã¯èªã¿åãã¢ãã«ãå«ãã·ã¹ãã ã®ä»ã®éšåã«ãã£ãŠæ¶è²»ãããŸãã
äŸïŒEã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³
Eã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³ãèããŠã¿ãŸããããåŸæ¥ã®ã¢ãŒããã¯ãã£ã§ã¯ãåäžã®ãProductããšã³ãã£ãã£ãååæ å ±ã®è¡šç€ºãšååè©³çŽ°ã®æŽæ°ã®äž¡æ¹ã«äœ¿çšããããããããŸããã
CQRSã®å®è£ ã§ã¯ãèªã¿åãã¢ãã«ãšæžã蟌ã¿ã¢ãã«ãåé¢ããŸãïŒ
- ã³ãã³ãã¢ãã«ïŒ
- `CreateProductCommand`ïŒæ°ããååãäœæããããã«å¿ èŠãªæ å ±ãå«ã¿ãŸãã
- `UpdateProductPriceCommand`ïŒååIDãšæ°ããäŸ¡æ Œãå«ã¿ãŸãã
- `CreateProductCommandHandler`ïŒ`CreateProductCommand`ãåŠçããæžã蟌ã¿ã¢ãã«ã«æ°ãã`Product`éçŽãäœæããŸãã
- `UpdateProductPriceCommandHandler`ïŒ`UpdateProductPriceCommand`ãåŠçããæžã蟌ã¿ã¢ãã«ã§ååã®äŸ¡æ ŒãæŽæ°ããŸãã
- ã¯ãšãªã¢ãã«ïŒ
- `GetProductDetailsQuery`ïŒååIDãå«ã¿ãŸãã
- `ListProductsQuery`ïŒãã£ã«ã¿ãªã³ã°ãšããŒãžããŒã·ã§ã³ã®ãã©ã¡ãŒã¿ãå«ã¿ãŸãã
- `GetProductDetailsQueryHandler`ïŒè¡šç€ºçšã«æé©åãããèªã¿åãã¢ãã«ããåå詳现ãååŸããŸãã
- `ListProductsQueryHandler`ïŒæå®ããããã£ã«ã¿ãŒãšããŒãžããŒã·ã§ã³ãé©çšããŠãèªã¿åãã¢ãã«ããååã®ãªã¹ããååŸããŸãã
èªã¿åãã¢ãã«ã¯ãåååã説æãäŸ¡æ Œãç»åãªã©ã衚瀺ã«å¿ èŠãªæ å ±ã®ã¿ãå«ããååã®ããŒã¿ã®éæ£èŠåããããã¥ãŒã§ããå¯èœæ§ããããŸããããã«ãããè€æ°ã®ããŒãã«ãçµåããããšãªããåå詳现ãé«éã«ååŸã§ããŸãã
`CreateProductCommand`ãå®è¡ããããšã`CreateProductCommandHandler`ã¯æžã蟌ã¿ã¢ãã«ã«æ°ãã`Product`éçŽãäœæããŸãããã®éçŽã¯`ProductCreatedEvent`ãçºçããããããã€ãã³ããã¹ã«çºè¡ãããŸããå¥ã®ããã»ã¹ããã®ã€ãã³ãã賌èªããããã«å¿ããŠèªã¿åãã¢ãã«ãæŽæ°ããŸãã
ããŒã¿åææŠç¥
æžã蟌ã¿ã¢ãã«ãšèªã¿åãã¢ãã«ã®éã§ããŒã¿ãåæããããã«ãããã€ãã®æŠç¥ã䜿çšã§ããŸãïŒ
- ã€ãã³ããœãŒã·ã³ã°ïŒã€ãã³ããœãŒã·ã³ã°ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãäžé£ã®ã€ãã³ããšããŠæ°žç¶åããŸããèªã¿åãã¢ãã«ã¯ããããã®ã€ãã³ããåçããããšã«ãã£ãŠæ§ç¯ãããŸãããã®ã¢ãããŒãã¯ãå®å šãªç£æ»èšŒè·¡ãæäŸããèªã¿åãã¢ãã«ããŒãããåæ§ç¯ããããšãå¯èœã«ããŸãã
- éåæã¡ãã»ãŒãžã³ã°ïŒéåæã¡ãã»ãŒãžã³ã°ã¯ãã¡ãã»ãŒãžãã¥ãŒãŸãã¯ãããŒã«ãŒã«ã€ãã³ããçºè¡ããããšãå«ã¿ãŸããèªã¿åãã¢ãã«ã¯ãããã®ã€ãã³ãã賌èªããããã«å¿ããŠèªèº«ãæŽæ°ããŸãããã®ã¢ãããŒãã¯ãæžã蟌ã¿ã¢ãã«ãšèªã¿åãã¢ãã«ã®éã®ççµåãæäŸããŸãã
- ããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³ïŒããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³ã¯ãæžã蟌ã¿ããŒã¿ããŒã¹ããèªã¿åãããŒã¿ããŒã¹ã«ããŒã¿ãè€è£œããããšãå«ã¿ãŸãããã®ã¢ãããŒãã¯å®è£ ãç°¡åã§ãããé å»¶ãäžè²«æ§ã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
CQRSãšã€ãã³ããœãŒã·ã³ã°
CQRSãšã€ãã³ããœãŒã·ã³ã°ã¯äºãã«è£å®ãåãããããã°ãã°äžç·ã«äœ¿çšãããŸããã€ãã³ããœãŒã·ã³ã°ã¯ãæžã蟌ã¿ã¢ãã«ãæ°žç¶åããèªã¿åãã¢ãã«ãæŽæ°ããããã®ã€ãã³ããçæããèªç¶ãªæ¹æ³ãæäŸããŸããCQRSãšã€ãã³ããœãŒã·ã³ã°ãçµã¿åããããšãããã€ãã®å©ç¹ããããŸãïŒ
- å®å šãªç£æ»èšŒè·¡ïŒã€ãã³ããœãŒã·ã³ã°ã¯ãã·ã¹ãã ã®ç¶æ ã«å¯Ÿãããã¹ãŠã®å€æŽã®å®å šãªç£æ»èšŒè·¡ãæäŸããŸãã
- ã¿ã€ã ãã©ãã«ãããã°ïŒã€ãã³ããœãŒã·ã³ã°ã«ãããã€ãã³ããåçããŠä»»æã®æç¹ã§ã®ã·ã¹ãã ã®ç¶æ ãåæ§ç¯ã§ããŸããããã¯ãããã°ãç£æ»ã«ãããŠéåžžã«äŸ¡å€ããããŸãã
- æéçã¯ãšãªïŒã€ãã³ããœãŒã·ã³ã°ã¯æéçã¯ãšãªãå¯èœã«ããç¹å®ã®æç¹ã«ååšããã·ã¹ãã ã®ç¶æ ãã¯ãšãªã§ããŸãã
- èªã¿åãã¢ãã«ã®å®¹æãªåæ§ç¯ïŒã€ãã³ããåçããããšã§ãèªã¿åãã¢ãã«ããŒãããç°¡åã«åæ§ç¯ã§ããŸãã
ããããã€ãã³ããœãŒã·ã³ã°ã¯ã·ã¹ãã ã«è€éããå ããŸããã€ãã³ãã®ããŒãžã§ãã³ã°ãã¹ããŒãã®é²åãã€ãã³ãã¹ãã¬ãŒãžã«ã€ããŠæ éã«èæ ®ããå¿ èŠããããŸãã
ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã«ãããCQRS
CQRSã¯ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã«èªç¶ã«é©åããŸããåãã€ã¯ããµãŒãã¹ã¯ç¬ç«ããŠCQRSãå®è£ ã§ããåãµãŒãã¹å ã§æé©åãããèªã¿åãã¢ãã«ãšæžã蟌ã¿ã¢ãã«ãå¯èœã«ããŸããããã«ãããççµåãã¹ã±ãŒã©ããªãã£ãç¬ç«ãããããã€ãä¿é²ãããŸãã
ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã§ã¯ãã€ãã³ããã¹ã¯ãã°ãã°Apache KafkaãRabbitMQã®ãããªåæ£ã¡ãã»ãŒãžãã¥ãŒã䜿çšããŠå®è£ ãããŸããããã«ããããã€ã¯ããµãŒãã¹éã®éåæéä¿¡ãå¯èœã«ãªããã€ãã³ãã確å®ã«é ä¿¡ãããããšãä¿èšŒãããŸãã
äŸïŒã°ããŒãã«Eã³ããŒã¹ãã©ãããã©ãŒã
ãã€ã¯ããµãŒãã¹ã䜿çšããŠæ§ç¯ãããã°ããŒãã«Eã³ããŒã¹ãã©ãããã©ãŒã ãèããŠã¿ãŸããããåãã€ã¯ããµãŒãã¹ã¯ã次ã®ãããªç¹å®ã®ãã¡ã€ã³é åãæ åœã§ããŸãïŒ
- ååã«ã¿ãã°ïŒåååã説æãäŸ¡æ Œãç»åãªã©ã®ååæ å ±ã管çããŸãã
- 泚æç®¡çïŒæ³šæã®äœæãåŠçããã«ãã£ã«ã¡ã³ãã管çããŸãã
- 顧客管çïŒãããã¡ã€ã«ãäœæãæ¯æãæ¹æ³ãªã©ã®é¡§å®¢æ å ±ã管çããŸãã
- åšåº«ç®¡çïŒåšåº«ã¬ãã«ãšåšåº«ç¶æ³ã管çããŸãã
ãããã®ãã€ã¯ããµãŒãã¹ã®ãããããç¬ç«ããŠCQRSãå®è£ ã§ããŸããããšãã°ãååã«ã¿ãã°ãã€ã¯ããµãŒãã¹ã¯ãååæ å ±ã®ããã®å¥ã ã®èªã¿åãã¢ãã«ãšæžã蟌ã¿ã¢ãã«ãæã€ãããããŸãããæžã蟌ã¿ã¢ãã«ã¯ãã¹ãŠã®åå屿§ãå«ãæ£èŠåãããããŒã¿ããŒã¹ã§ãããèªã¿åãã¢ãã«ã¯ãŠã§ããµã€ãã§åå詳现ã衚瀺ããããã«æé©åããã鿣èŠåãã¥ãŒã§ããå¯èœæ§ããããŸãã
æ°ããååãäœæããããšãååã«ã¿ãã°ãã€ã¯ããµãŒãã¹ã¯`ProductCreatedEvent`ãã¡ãã»ãŒãžãã¥ãŒã«çºè¡ããŸããæ³šæç®¡çãã€ã¯ããµãŒãã¹ã¯ãã®ã€ãã³ãã賌èªããæ³šæã®æŠèŠã«æ°ããååãå«ããããã«ããŒã«ã«ã®èªã¿åãã¢ãã«ãæŽæ°ããŸããåæ§ã«ã顧客管çãã€ã¯ããµãŒãã¹ã¯ã顧客ãžã®ååæšèŠãããŒãœãã©ã€ãºããããã«`ProductCreatedEvent`ã賌èªãããããããŸããã
CQRSã®èª²é¡
CQRSã¯å€ãã®å©ç¹ãæäŸããŸãããããã€ãã®èª²é¡ããããããŸãïŒ
- è€éæ§ã®å¢å ïŒCQRSã¯ã·ã¹ãã ã¢ãŒããã¯ãã£ã«è€éããå ããŸããèªã¿åãã¢ãã«ãšæžã蟌ã¿ã¢ãã«ãé©åã«åæãããããã«ãæ éãªèšç»ãšèšèšãå¿ èŠã§ãã
- çµææŽåæ§ïŒCQRSã¯ãã°ãã°çµææŽåæ§ãæ¡çšããŸãããããã¯å³æã®ããŒã¿æŽæ°ãæåŸ ãããŠãŒã¶ãŒã«ãšã£ãŠã¯èª²é¡ãšãªãå¯èœæ§ããããŸãã
- ããŒã¿åæïŒèªã¿åãã¢ãã«ãšæžã蟌ã¿ã¢ãã«éã®ããŒã¿åæãç¶æããããšã¯è€éã§ãããããŒã¿äžæŽåã®å¯èœæ§ãæ éã«èæ ®ããå¿ èŠããããŸãã
- ã€ã³ãã©ã¹ãã©ã¯ãã£èŠä»¶ïŒCQRSã¯ãã¡ãã»ãŒãžãã¥ãŒãã€ãã³ãã¹ãã¢ãªã©ã®è¿œå ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ããã°ãã°å¿ èŠãšããŸãã
- åŠç¿æ²ç·ïŒéçºè ã¯CQRSã广çã«å®è£ ããããã«ãæ°ããæŠå¿µãæè¡ãåŠã¶å¿ èŠããããŸãã
CQRSã®ãã¹ããã©ã¯ãã£ã¹
CQRSãæåè£ã«å®è£ ããããã«ã¯ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸãããšãéèŠã§ãïŒ
- ã·ã³ãã«ã«å§ããïŒäžåºŠã«ãã¹ãŠã®å Žæã«CQRSãå®è£ ããããšããªãã§ãã ãããã·ã¹ãã ã®å°ããéé¢ãããé åããå§ããå¿ èŠã«å¿ããŠåŸã ã«ãã®äœ¿çšãæ¡å€§ããŠãã ããã
- ããžãã¹äŸ¡å€ã«çŠç¹ãåœãŠãïŒCQRSãæãããžãã¹äŸ¡å€ãæäŸã§ããã·ã¹ãã ã®é åãéžæããŠãã ããã
- ã€ãã³ããœãŒã·ã³ã°ãè³¢ã䜿ãïŒã€ãã³ããœãŒã·ã³ã°ã¯åŒ·åãªããŒã«ã§ãããè€éããå ãããŸããã³ã¹ããäžåãå©ç¹ãããå Žåã«ã®ã¿äœ¿çšããŠãã ããã
- ç£èŠãšæž¬å®ïŒèªã¿åãã¢ãã«ãšæžã蟌ã¿ã¢ãã«ã®ããã©ãŒãã³ã¹ãç£èŠããå¿ èŠã«å¿ããŠèª¿æŽããŠãã ããã
- ããŒã¿åæãèªååããïŒèªã¿åãã¢ãã«ãšæžã蟌ã¿ã¢ãã«éã®ããŒã¿åæããã»ã¹ãèªååããããŒã¿äžæŽåã®å¯èœæ§ãæå°éã«æããŠãã ããã
- æç¢ºã«äŒããïŒçµææŽåæ§ã®åœ±é¿ããŠãŒã¶ãŒã«æç¢ºã«äŒããŠãã ããã
- 培åºçã«ææžåããïŒä»ã®éçºè ãçè§£ããä¿å®ã§ããããã«ãCQRSã®å®è£ ã培åºçã«ææžåããŠãã ããã
CQRSã®ããŒã«ãšãã¬ãŒã ã¯ãŒã¯
CQRSã®å®è£ ãç°¡çŽ åããã®ã«åœ¹ç«ã€ããã€ãã®ããŒã«ãšãã¬ãŒã ã¯ãŒã¯ããããŸãïŒ
- MediatR (C#): ã³ãã³ããã¯ãšãªãã€ãã³ãããµããŒããã.NETåãã®ã·ã³ãã«ãªã¡ãã£ãšãŒã¿ãŒå®è£ ã
- Axon Framework (Java): CQRSããã³ã€ãã³ããœãŒã¹ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®å æ¬çãªãã¬ãŒã ã¯ãŒã¯ã
- Broadway (PHP): PHPåãã®CQRSããã³ã€ãã³ããœãŒã·ã³ã°ã©ã€ãã©ãªã
- EventStoreDB: ã€ãã³ããœãŒã·ã³ã°å°çšã«æ§ç¯ãããããŒã¿ããŒã¹ã
- Apache Kafka: ã€ãã³ããã¹ãšããŠäœ¿çšã§ãã忣ã¹ããªãŒãã³ã°ãã©ãããã©ãŒã ã
- RabbitMQ: ãã€ã¯ããµãŒãã¹éã®éåæéä¿¡ã«äœ¿çšã§ããã¡ãã»ãŒãžãããŒã«ãŒã
CQRSã®å®äžçã§ã®äŸ
å€ãã®å€§äŒæ¥ãã¹ã±ãŒã©ãã«ã§ä¿å®æ§ã®é«ãã·ã¹ãã ãæ§ç¯ããããã«CQRSã䜿çšããŠããŸãã以äžã«ããã€ãã®äŸãæããŸãïŒ
- Netflix: Netflixã¯ãèšå€§ãªæ ç»ããã¬ãçªçµã®ã«ã¿ãã°ã管çããããã«CQRSãåºç¯å²ã«äœ¿çšããŠããŸãã
- Amazon: Amazonã¯ãé«ããã©ã³ã¶ã¯ã·ã§ã³éãšè€éãªããžãã¹ããžãã¯ãåŠçããããã«ãEã³ããŒã¹ãã©ãããã©ãŒã ã§CQRSã䜿çšããŠããŸãã
- LinkedIn: LinkedInã¯ããŠãŒã¶ãŒãããã¡ã€ã«ãšæ¥ç¶ã管çããããã«ããœãŒã·ã£ã«ãããã¯ãŒãã³ã°ãã©ãããã©ãŒã ã§CQRSã䜿çšããŠããŸãã
- Microsoft: Microsoftã¯ãAzureãOffice 365ãªã©ã®ã¯ã©ãŠããµãŒãã¹ã§CQRSã䜿çšããŠããŸãã
ãããã®äŸã¯ãCQRSãEã³ããŒã¹ãã©ãããã©ãŒã ãããœãŒã·ã£ã«ãããã¯ãŒãã³ã°ãµã€ããŸã§ãå¹ åºãã¢ããªã±ãŒã·ã§ã³ã«æåè£ã«é©çšã§ããããšã瀺ããŠããŸãã
çµè«
CQRSã¯ãè€éãªã·ã¹ãã ã®æ¡åŒµæ§ãä¿å®æ§ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ãã匷åãªã¢ãŒããã¯ãã£ãã¿ãŒã³ã§ããèªã¿åãæäœãšæžãèŸŒã¿æäœãå¥ã ã®ã¢ãã«ã«åé¢ããããšã§ãCQRSã¯ç¬ç«ããæé©åãšã¹ã±ãŒãªã³ã°ãå¯èœã«ããŸããCQRSã¯è¿œå ã®è€éãã䌎ããŸãããå€ãã®ã·ããªãªã§ãã®å©ç¹ã¯ã³ã¹ããäžåãå¯èœæ§ããããŸããCQRSã®ååãå©ç¹ã課é¡ãçè§£ããããšã§ãéçºè ã¯ãã®ãã¿ãŒã³ããã€ãã©ã®ããã«ãããžã§ã¯ãã«é©çšãããã«ã€ããŠãæ å ±ã«åºã¥ããæ±ºå®ãäžãããšãã§ããŸãã
ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ãè€éãªãã¡ã€ã³ã¢ãã«ããŸãã¯é«æ§èœã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠããå Žåã§ããCQRSã¯ããªãã®ã¢ãŒããã¯ãã£ã®æŠåšåº«ã§è²ŽéãªããŒã«ãšãªãåŸãŸããCQRSãšããã«é¢é£ãããã¿ãŒã³ãåãå ¥ããããšã§ãããã¹ã±ãŒã©ãã«ã§ä¿å®æ§ãé«ããå€åã«åŒ·ãã·ã¹ãã ãæ§ç¯ã§ããŸãã
ãããªãåŠç¿ã®ããã«
- ããŒãã£ã³ã»ãã¡ãŠã©ãŒã®CQRSã«é¢ããèšäºïŒ https://martinfowler.com/bliki/CQRS.html
- ã°ã¬ãã°ã»ã€ã³ã°ã®CQRSã«é¢ããããã¥ã¡ã³ãïŒ ãGreg Young CQRSãã§æ€çŽ¢ããŠèŠã€ããããšãã§ããŸãã
- Microsoftã®ããã¥ã¡ã³ãïŒ Microsoft Docsã§CQRSãšãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã®ã¬ã€ãã©ã€ã³ãæ€çŽ¢ããŠãã ããã
ãã®CQRSã®æ¢æ±ã¯ããã®åŒ·åãªã¢ãŒããã¯ãã£ãã¿ãŒã³ãçè§£ããå®è£ ããããã®å åºãªåºç€ãæäŸããŸããCQRSãæ¡çšãããã©ãããæ±ºå®ããéã«ã¯ããããžã§ã¯ãã®ç¹å®ã®ããŒãºãšã³ã³ããã¹ããèæ ®ããããšãå¿ããªãã§ãã ãããããªãã®ã¢ãŒããã¯ãã£ã®æ ã«å¹žããïŒ